home *** CD-ROM | disk | FTP | other *** search
- #if !defined(USEDUMP)
- #include "lprlib.h"
- #include "lprdef.h"
- #include "lprfuncs.h"
- #else
- #pragma load "lprDumpFile"
- #endif
-
- unsigned char prtstate; /* print processing state */
- unsigned long prtstime; /* time prtstate last changed */
- unsigned char filename[30]; /* filename for server to use */
- unsigned char sbuf[512]; /* tcp send buffer */
- short sbuflen; /* size of send buffer */
- unsigned char cmds[1024]; /* control data buffer */
- unsigned char prtfname[128]; /* name of file to print */
- extern unsigned char pend_conn(); /* connection status */
- extern unsigned char myipnum[4]; /* my IP number */
-
- static unsigned char prtmsg[128]; /* debug message buffer */
- unsigned long filesize; /* total number of data bytes we send */
- short vnum; /* volume number for file I/O */
- unsigned char * filelist; /* pointer to list of files to process */
- unsigned char countonly; /* flag to only count output */
- short prtfcount; /* count of files printed */
-
- extern unsigned long * Ticks;
- extern settings_list cs, ds;
- extern unsigned char setmsg1[];
- extern unsigned char setmsg2[];
- extern unsigned char vmpass[]; /* VM password */
- extern unsigned long passtime; /* time password last stored */
- extern struct Point sfgpoint; /* standard get file dialog location */
- extern unsigned char printlist; /* TRUE if list to be printed */
- extern DialogPtr statptr;
- extern unsigned char prtstat[];
-
- void printit(void)
- {
- Point where;
- FileFilterProcPtr fileFilter;
- DlgHookProcPtr dlgHook;
- short numTypes;
- SFTypeList typeList;
- SFReply reply;
- pascal Boolean (*filterProc)();
-
- OSErr rc;
- unsigned long listsize, readcount;
- short fnum;
-
- /* for VM printers, get a valid password */
- if (cs.vmflag) {
- if (((*Ticks) - passtime) > PASSLIMIT)
- memset(vmpass, 0, 9);
- if ((vmpass[0] == 0) || (cs.vmuser[0] == 0))
- destdlg(1); /* ensure we get all three or none */
- /* unless user selected "cancel" */
- if (cs.vmflag) {
- if ((vmpass[0] == 0) || (cs.vmuser[0] == 0))
- return;
- }
- }
-
- /* get input file from user */
-
- where = sfgpoint;
- fileFilter = 0;
- dlgHook = 0;
- numTypes = 1;
- typeList[0] = 'TEXT';
- dlgHook = 0;
- filterProc = SF_Filter;
- if (filelist)
- SFPGetFile(where, "\pSelect list of files:", fileFilter,
- numTypes, typeList, dlgHook, &reply, getDlgID,
- (ModalFilterProcPtr)filterProc);
- else
- SFPGetFile(where, "\pSelect file to be printed:", fileFilter,
- numTypes, typeList, dlgHook, &reply, getDlgID,
- (ModalFilterProcPtr)filterProc);
- if (reply.good == 0) return;
- p2cstr(&reply.fName); /* save filename */
- strcpy(prtfname, &reply.fName);
- c2pstr(&reply.fName);
- vnum = reply.vRefNum; /* save volume reference */
- if (statptr) { /* restore status in case covered */
- DrawDialog(statptr);
- statGrowIcon();
- }
-
- /* set filelist to point to list of files to print */
- if (printlist) {
- /* prepare first part of error messages */
- sprintf(setmsg1, "Error reading file \"%s\"", prtfname);
- rc = fsrdopen(prtfname, vnum, &fnum);
- if (rc != 0) {
- sprintf(setmsg2, "Error %d opening file", rc);
- seterr();
- return;
- }
- rc = GetEOF(fnum, (long *)&listsize); /* get file size */
- if (rc != 0) {
- FSClose(fnum);
- sprintf(setmsg2, "Error %d getting file size", rc);
- seterr();
- return;
- }
- filelist = (unsigned char *)NewPtr(listsize+2); /* allocate buffer */
- /* extra bytes for null and new line */
- if (filelist == 0L) {
- FSClose(fnum);
- sprintf(setmsg2, "Not enough storage (%ld bytes) for list file", listsize);
- seterr();
- return;
- }
- readcount = listsize; /* read file data */
- rc = FSRead(fnum, (long *)&readcount, filelist);
- FSClose(fnum); /* close file */
- if ((rc != 0) || (readcount != listsize)) {
- DisposPtr(filelist);
- filelist = 0;
- if (rc == 0) rc = 4;
- sprintf(setmsg2, "Error %d reading file contents", rc);
- seterr();
- return;
- }
- }
- else { /* single file */
- listsize = strlen(prtfname);
- filelist = (unsigned char *)NewPtr(listsize+2); /* allocate buffer */
- /* extra bytes for null and new line */
- if (filelist == 0L) {
- stgalert("print file name", "NewPtr", listsize+2);
- return;
- }
- strcpy(filelist, prtfname);
- }
-
- filelist[listsize] = 0; /* terminate list */
- /* make sure last character is CR */
- if (filelist[listsize-1] != 0x0d) strcat(filelist, "\015");
-
- /* get number of bytes we will send for file data */
- countonly = 1; /* call formatter for counting only */
- prtfcount = 0; /* reset file count */
- rc = prtformat();
- /* sets "filesize" if rc = 0 */
- if (rc != 0) {
- sprintf(setmsg2, "Error %d calculating file size", rc);
- seterr();
- prtclean();
- return;
- }
- countonly = 0; /* really send next time */
- sprintf(prtstat, "Ready to send %ld bytes", filesize);
- statdlg(0, 0x04);
-
- /* attempt to open connection to lpd */
- prtstate = 0;
- prtstime = (*Ticks);
- watchcurs();
- tcplgin();
- }
-
- void prtevent(s, len)
- unsigned char * s;
- short len;
- {
- OSErr rc;
-
- sprintf(prtmsg, "print event at state %d", prtstate);
- putln(prtmsg);
-
- switch(prtstate) {
- case 0: /* waiting for open */
- if (s != 0) return;
- sprintf(prtstat, "Sending printer name");
- statdlg(0, 0x04);
- prtstate = 1;
- prtstime = (*Ticks);
- sprintf(sbuf, "\2%s\r", cs.printer);
- tcpwrite(sbuf, strlen(sbuf));
- break;
- case 1: /* waiting for printer name response */
- tcpdump("name response", s, len);
- if ((s[0] != '\0') || (len != 1)) {
- tcplgout();
- server_err(s, len, 1, 0, 0);
- return;
- }
- sprintf(prtstat, "Sending file information");
- statdlg(0, 0x04);
- prtstate = 2;
- prtstime = (*Ticks);
- sendfinfo(); /* send file info */
- break;
- case 2: /* waiting for file info. response */
- tcpdump("info response", s, len);
- if (s[0] == '\2') {
- tcplgout();
- stoperr(sizalrt);
- return;
- }
- else if ((s[0] != '\0') || (len != 1)) {
- tcplgout();
- server_err(s, len, 0, 0, 0);
- return;
- }
- prtstate = 3;
- prtstime = (*Ticks);
- prtfcount = 0; /* reset file count */
- rc = prtformat(); /* send file data */
- if (rc != 0) {
- tcplgout();
- return;
- }
- break;
- case 3:
- tcpdump("data response", s, len);
- if ((s[0] != '\0') || (len != 1)) {
- tcplgout();
- server_err(s, len, 0, 0, 1);
- return;
- }
- sprintf(prtstat, "Sending control information");
- statdlg(0, 0x04);
- prtstate = 4;
- prtstime = (*Ticks);
- sendctlinfo(); /* send control info */
- break;
- case 4:
- tcpdump("ctlinfo response", s, len);
- if (s[0] == '\2') {
- tcplgout();
- stoperr(sizalrt);
- return;
- }
- else if ((s[0] != '\0') || (len != 1)) {
- tcplgout();
- server_err(s, len, 0, 1, 0);
- return;
- }
- sprintf(prtstat, "Sending control file");
- statdlg(0, 0x04);
- prtstate = 5;
- prtstime = (*Ticks);
- sendcontrol(); /* send control data */
- break;
- case 5:
- tcpdump("control data response", s, len);
- if ((s[0] != '\0') || (len != 1)) {
- tcplgout();
- server_err(s, len, 0, 1, 1);
- return;
- }
- tcplgout(); /* resets prtstate, prtstime */
- if (printlist) {
- sprintf(setmsg1, "List \"%s\" (%d files) sent successfully to %s at %s",
- prtfname, prtfcount, cs.printer, cs.hostname);
- }
- else {
- sprintf(setmsg1, "File \"%s\" sent successfully to %s at %s",
- prtfname, cs.printer, cs.hostname);
- }
- if (cs.vmflag) sprintf(setmsg2, "Printed for VM userid %s", cs.vmuser);
- else sprintf(setmsg2, "Printed for user %s", cs.orguser);
- okalrt();
- break;
- default:
- break;
- }
- }
-
- void sendfinfo(void)
- {
- static unsigned long * Time = 0x20C;
- unsigned long currtime;
- short filetime;
-
- /* compute filename to use, except for first letter */
- currtime = *Time; /* wait for time to change */
- while (currtime == *Time) /*Stask()*/;
- filetime = (*Time)%999; /* last 3 digits for file */
- if (cs.newprot) {
- sprintf(filename, "dfA%03d%d.%d.%d.%d", filetime,
- myipnum[0], myipnum[1], myipnum[2], myipnum[3]);
- }
- else {
- sprintf(filename, "fA%03d%d.%d.%d.%d", filetime,
- myipnum[0], myipnum[1], myipnum[2], myipnum[3]);
- }
- sprintf(prtmsg, "server filename = <%s>", filename);
- putln(prtmsg);
-
- sprintf(sbuf, "\3%ld d%s\r", filesize, filename);
- tcpwrite(sbuf, strlen(sbuf));
- }
-
- void sendctlinfo(void)
- {
- register short i;
- short copies;
-
- sprintf(cmds, "H%d.%d.%d.%d\r", myipnum[0],
- myipnum[1], myipnum[2], myipnum[3]);
- if (cs.orguser[0] != 0) sprintf(cmds+strlen(cmds), "P%s\r", cs.orguser);
- else sprintf(cmds+strlen(cmds), "P%s\r", ds.orguser);
- if (cs.hdrflag) {
- if (cs.jobname[0] != 0) sprintf(cmds+strlen(cmds), "J%s\r", cs.jobname);
- else sprintf(cmds+strlen(cmds), "J%s\r", ds.jobname);
- if (cs.hdrclass[0] != 0) sprintf(cmds+strlen(cmds), "C%s\r", cs.hdrclass);
- else sprintf(cmds+strlen(cmds), "C%s\r", ds.hdrclass);
- if (cs.hdrid[0] != 0) sprintf(cmds+strlen(cmds), "L%s\r", cs.hdrid);
- else sprintf(cmds+strlen(cmds), "L%s\r", ds.hdrid);
- }
- if (cs.fmttype == 3) {
- if (cs.findent > 0) sprintf(cmds+strlen(cmds), "I%d\r", cs.findent);
- if (cs.fwidth > 0) sprintf(cmds+strlen(cmds), "W%d\r", cs.fwidth);
- if (cs.fmttitle[0] != 0) sprintf(cmds+strlen(cmds), "T%s\r", cs.fmttitle);
- }
- copies = cs.copycnt;
- if (copies <= 0) copies = 1;
- for (i=0; i < copies; i++) {
- if (cs.fmttype == 3)
- sprintf(cmds+strlen(cmds), "pd%s\r", filename);
- else
- sprintf(cmds+strlen(cmds), "fd%s\r", filename);
- }
- sprintf(cmds+strlen(cmds), "Ud%s\r", filename);
- if (cs.vmflag) {
- sprintf(cmds+strlen(cmds), "B%s %s", cs.vmuser, vmpass);
- if (cs.vmform[0] != 0) sprintf(cmds+strlen(cmds), " %s", cs.vmform);
- else sprintf(cmds+strlen(cmds), " %s", ds.vmform);
- if (cs.vmclass[0] != 0) sprintf(cmds+strlen(cmds), " %s\r", cs.vmclass);
- else sprintf(cmds+strlen(cmds), " %s\r", ds.vmclass);
- }
- i = 0;
- while (prtfname[i] != 0) {
- prtfname[i] &= 0x7f;
- if (prtfname[i] == ' ') prtfname[i] = '_';
- i++;
- }
- sprintf(cmds+strlen(cmds), "N%s\r", prtfname);
- putln("Commands:");
- putln(cmds);
- sprintf(sbuf, "\2%d c%s\r", strlen(cmds), filename);
- tcpwrite(sbuf, strlen(sbuf));
- }
-
- void sendcontrol(void)
- {
- tcpwrite(cmds, strlen(cmds)+1);
- }
-
- void server_err(s, len, prtname, ctl, file)
- unsigned char * s;
- short len, prtname, ctl, file;
- {
- unsigned char * m;
- short i, j;
- unsigned char msg1[48], s1[8], s2[6];
- static unsigned char msg2[] = {"Description not available"};
- pascal Boolean (*filterProc)();
-
- filterProc = DlgFilter; /* for alert */
- /* prepare first message line */
- if (prtname) {
- strcpy(s1, "Printer");
- strcpy(s2, "name");
- }
- else {
- if (ctl) strcpy(s1, "Control");
- else strcpy(s1, "Data");
- if (file) strcpy(s2, "file");
- else strcpy(s2, "info");
- }
- sprintf(msg1, "%s %s rejected by LPD server:", s1, s2);
-
- memset(prtmsg, 0, 128); /* get null-terminated string */
- memcpy(prtmsg, s, len);
- m = prtmsg;
- if ((m[0] == 0) && (len > 1)) m++;
- while ((m[0] != 0) && (m[0] < 0x20)) m++;
- j = 0;
- for (i=0; i < strlen(m); i++) {
- if (m[i] <= 0x20) m[i] = 0x20;
- else j = i + 1;
- }
- m[j] = 0;
- if (m[0] == 0) {
- c2pstr(msg1);
- c2pstr(msg2);
- ParamText(msg1, msg2, "\p", "\p");
- p2cstr(msg1);
- p2cstr(msg2);
- putln(msg1);
- putln(msg2);
- }
- else {
- c2pstr(msg1);
- c2pstr(m);
- ParamText(msg1, m, "\p", "\p");
- p2cstr(msg1);
- p2cstr(m);
- putln(msg1);
- putln(m);
- }
- StopAlert(261, (ModalFilterProcPtr)filterProc);
- ParamText("\p", "\p", "\p", "\p");
- }
-
- void okalrt(void)
- {
- pascal Boolean (*filterProc)();
-
- filterProc = DlgFilter; /* for error alert */
- c2pstr(setmsg1);
- c2pstr(setmsg2);
- ParamText(setmsg1, setmsg2, "\p", "\p");
- p2cstr(setmsg1);
- p2cstr(setmsg2);
- putln(setmsg1);
- putln(setmsg2);
- NoteAlert(263, (ModalFilterProcPtr)filterProc);
- ParamText("\p", "\p", "\p", "\p");
- }
-